/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ihmprojet.core.historique;

import ihmprojet.core.model.Arrete;
import ihmprojet.core.model.DelegateTreeOperators;
import ihmprojet.core.model.Sommet;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * @author Rémi PIOTAIX <remi.piotaix@gmail.com>
 */
public class SupprimerSommetAction extends AbstractAction {

    private DelegateTreeOperators<Sommet, Arrete> tree;
    private Sommet sommet;
    private Map<Sommet, Arrete> delArretes = new HashMap();
    private Map<Sommet, Arrete> addedArretes = new HashMap();
    private Sommet sommetPere;
    private Arrete arreteVersPere;
    private boolean init = false;

    public SupprimerSommetAction(DelegateTreeOperators<Sommet, Arrete> tree, Sommet sommet) {
        this.tree = tree;
        this.sommet = sommet;
    }

    @Override
    protected void doInitialize() {
        for (Arrete a : tree.getOutEdges(sommet)) {
            Sommet dest = tree.getDest(a);
            delArretes.put(dest, a);
            addedArretes.put(dest, new Arrete(a));
        }
        sommetPere = tree.getParent(sommet);
        arreteVersPere = tree.getParentEdge(sommet);
    }

    @Override
    public void doExecute() {

        //detacher tous les fils du sommet  et les attacher a son père
        for (Sommet dest : delArretes.keySet()) {
            tree.removeEdge(delArretes.get(dest));
            tree.addEdge(addedArretes.get(dest), sommetPere, dest);
        }
        // supprimer le sommet
        tree.removeChild(sommet);
    }

    @Override
    public void doReverse() {
        //Ajouter le sommet supprimé et l'attacher à son père
        tree.addEdge(arreteVersPere, sommetPere, sommet);

        // rattacher tous ses anciens fils et les détacher de leur parent (qui est le parent du sommet supprimé)
        for (Sommet dest : delArretes.keySet()) {
            tree.removeEdge(addedArretes.get(dest));
            tree.addEdge(delArretes.get(dest), sommet, dest);
        }
        
    }

    @Override
    public boolean canReverse() {
        return true;
    }

    @Override
    public boolean canExecute() {
        return true;
    }

    @Override
    public String getNom() {
        return "Supression sommet";
    }
}
